唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。

小课堂【武汉第17期】

分享人:甘乐乐

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

索引(INDEX)是寻找资源中特定项目的一种机制,其实质是一种以特定顺序保存的表。索引的作用是便捷化检索表中的行和列的子集,而不需要检查表中的每行。常见有INDEX、UNIQUE INDEX、FULLTXET INDEX和SPATIAL INDEX(仅MyISAM支持后两者)。

2.知识剖析

UNIQUE INDEX具备INDEX的全部特点,还作为一种机制限制索引列出现重复值,即设置为UNIQUE INDEX的列或者字段,其对应的值必须唯一。唯一索引可以保证数据记录的唯一性。

通常,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。即向表中插入一条记录,DBMS首先检查该记录中被定义为UNIQUE INDEX字段的值是否已经存在;如果是,DBMS将拒绝插入那条新记录。

3.常见问题

每个索引实质上是一个表,需要占用磁盘空间与维护管理。每次对表增或删,表中的所有INDEX必须被修改;更新行时,受影响的的列的任何INDEX也必须被修改。一旦发生较多INDEX更改,服务器的处理性能将被拖累。

4.解决方案

INDEX默认使用策略(一)

确保所有主键列被索引;

INDEX默认使用策略(二)

为所有被外键约束引用的列创建索引;

INDEX默认使用策略(三)

索引被频繁检索的列。

5.编码实战

1)创建索引

mysql> ALTER TABLE Registration
-> ADD INDEX reg_name_idx(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

2)创建唯一索引

mysql> CREATE INDEX reg_name_idx
-> ON Registration (name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

从MySQL5.0开始,create index命令已经映射到alter table命令,但是前者依旧可用。

3)删除索引

mysql> ALTER TABLE Registration
-> DROP INDEX reg_QQ_idx;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

4)插入一条记录

mysql> INSERT INTO Registration(QQ)
-> VALUES('505034172');
Query OK, 0 rows affected (0.02 sec)
ERROR 1062 (23000): Duplicate entry '505034172' for key
reg_QQ_idx'

表Registration中已经存在VALUE(QQ)='505034172'的记录,插入操作被拒绝。

5)查看索引

mysql> SHOW INDEX FROM Registration \G

在实施主键约束(primary key)、外键约束(foreign key)和唯一约束(unique key)时,MySQL自动生成新索引;而SQL Sever和Oracle处理机制则不同。

6.扩展思考

基于报名帖的学员表,如果对QQ建立了UNIQUE INDEX,在插入新的学员记录时候,是否需要先判断这个QQ是否存在?

7.参考文献

Alan Beaulieu . SQL 学习指南(第2版).张伟超 林青松译.北京:人民邮电出版社,2015.

8.更多讨论

今天的分享就到这里啦,欢迎大家拍砖和吐槽!

鸣谢

首先感谢我的辅导师兄 王玉琛和刘家铭在学习DBMS过程中对我给予指导和释疑,其次感谢大家观看。